#! usr/bin/env python
#-*- coding: UTF-8 -*-

class Vertice(object):
	def __init__(self, id, datos):
		self.adyacentes = {}
		self.datos = datos
		self.id = id

	def __cmp__(self, otro):
		if self.id == otro.id:
			return 0
		if self.id > otro.id:
			return 1
		if self.id < otro.id:
			return -1
			
	def ver_adyacentes(self):
		'''Devuelve un diccionario con los vértices adyacentes al vértice'''	
		return self.adyacentes.keys()
		
class Grafo(object):
	def __init__(self):
		self.vertices = {}

	def esta_vertice(self, vertice):
		'''Devuelve true or false según el vértice esté en el grafo o no'''
		if not vertice:
			return False
		return self.vertices.has_key(vertice.id)	
		
		
	def agregar_vertice(self,vertice):
	#Agrega un vértice al grafo. Si ya existía, devuelve false
		if self.esta_vertice(vertice):
			return False
		self.vertices[vertice.id] = vertice
		return True
		
	def obtener_vertice(self,id):
		'''Dado un id devuelve el objeto vértice correspondiente'''
		if id in self.vertices.keys():
			return self.vertices[id]
		return None
	
	def agregar_arista(self, vertice1, vertice2, datos):
		'''Agrega la arista que va desde vértice1 hacia vértice2'''
		if (not self.esta_vertice(vertice1)) or (not self.esta_vertice(vertice2)):
			return False
		vertice1.adyacentes[vertice2.id] = datos
		
		return True
		
	def borrar_vertice(self, vertice):
		if not self.esta_vertice(vertice):
			return False
		del self.vertices[vertice.id]
		return True
		
	def borrar_arista (self, vertice1, vertice2):
		'''Borra la arista que va desde el vertice1 hacia el vertice2'''
		if not self.esta_vertice(vertice1) or not self.esta_vertice(vertice2):
			return False
		ady = vertice1.adyacentes
		if vertice2.id in ady.keys():
			del ady[vertice2.id]
		return True
		
	def aristas(self, vertice):
		'''Devuelve una lista de tuplas (vértice adyacente, datos) de cada arista que sale del vértice. '''	
		aristas = []
		adyacentes = vertice.adyacentes
		for id in adyacentes.keys():
			vertice = self.obtener_vertice(id)
			datos = adyacentes[id]
			aristas.append((vertice, datos))
		return aristas
	
	
			
